package reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 反射机制访问私有方法
 */

public class ReflectDemo7 {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
        // Person person = new Person();
        // Person.hehe(); 类的外部不能范文类的私有成员，编译不通过

        Class cls = Class.forName("reflect.Person");
        Object obj = cls.newInstance();
        /*
            Class获取类成员信息有两套方法,一套方法名中带"Declared",一套不带
            带"Declared"的方法获取的是本类自己定义的成员，包含私有成员。
            而不带的只能获取到类中的公开成员，包含从超类继承的。

            例如
            getMethod():仅能获取本类中的公开方法，以及从超类继承的方法
            getDeclaredMethod():可以获取本类自己定义的所有方法，包含私有方法。不包含从超类继承的。
         */

        // Method method = cls.getMethod("hehe");
        Method method = cls.getDeclaredMethod("hehe");
        method.setAccessible(true);//强行打开访问权限
        method.invoke(obj);
        method.setAccessible( false);//调用完毕后关闭访问权限
    }
}
